#!/bin/bash
 E='echo -e';e='echo -en';trap "R;exit" 2
 ESC=$( $e "\e")
 TPUT(){ $e "\e[${1};${2}H" ;}
 CLEAR(){ $e "\ec";}
# 25 возможно это
 CIVIS(){ $e "\e[?25l";}
# это цвет текста списка перед курсором при значении 0 в переменной  UNMARK(){ $e "\e[0m";}
 MARK(){ $e "\e[1;90m";}
# 0 это цвет заднего фона списка
 UNMARK(){ $e "\e[0m";}
# ~~~~~~~~ Эти строки задают цвет фона ~~~~~~~~
 R(){ CLEAR ;stty sane;CLEAR;};
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 HEAD(){ for (( a=2; a<=33; a++ ))
  do
   TPUT $a 1
 $E "\033[34m\xE2\x94\x82                                                                                                                \xE2\x94\x82\033[0m";
  done
 TPUT 1 1
 $E "\033[34m+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+\033[0m"
 TPUT 2 4
 $E "\033[1;36m *** ping - отправить ICMP ECHO_REQUEST на сетевые узлы ***\033[0m                        \033[34m|\033[0m";
 TPUT 4 4
 $E "\033[1;36mОпции                                                                              \033[34m| \033[32mOPTIONS\033[0m";
 TPUT 31 4
 $E "\033[36mUp \xE2\x86\x91 \xE2\x86\x93 Down Select Enter                                                           \033[34m| \033[32m";
 MARK;TPUT 3 1
 $E "\033[34m+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+\033[0m";UNMARK;}
  i=0; CLEAR; CIVIS;NULL=/dev/null
 FOOT(){ MARK;TPUT 34 1
 $E "\033[0m\033[34m+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+\033[0m";UNMARK;}
# это управляет кнопками ввер/хвниз
 i=0; CLEAR; CIVIS;NULL=/dev/null
#
 ARROW(){ IFS= read -s -n1 key 2>/dev/null >&2
           if [[ $key = $ESC ]];then
              read -s -n1 key 2>/dev/null >&2;
              if [[ $key = \[ ]]; then
                 read -s -n1 key 2>/dev/null >&2;
                 if [[ $key = A ]]; then echo up;fi
                 if [[ $key = B ]];then echo dn;fi
              fi
           fi
           if [[ "$key" == "$($e \\x0A)" ]];then echo enter;fi;}
 M0(){ TPUT  5 3; $e "Запросите локальные адреса IPv6                                                     \033[32m    ipv6-linklocal       \033[0m";}
 M1(){ TPUT  6 3; $e "Запросить адреса IPv6 на других интерфейсах                                         \033[32m    ipv6-all             \033[0m";}
 M2(){ TPUT  7 3; $e "Запросы адресов IPv4. Есть один специфический флаг IPv4                             \033[32m    ipv4                 \033[0m";}
 M3(){ TPUT  8 3; $e "Запросить адреса IPv4 на других интерфейсах                                         \033[32m    ipv4-all             \033[0m";}
 M4(){ TPUT  9 3; $e "Субъектный адрес IPv6                                                               \033[32m    subject-ipv6=ipv6addr\033[0m";}
 M5(){ TPUT 10 3; $e "Субъектный адрес IPv4                                                               \033[32m    subject-ipv4=ipv4addr\033[0m";}
 M6(){ TPUT 11 3; $e "Имя субъекта. Если он содержит более одной точки                                    \033[32m    subject-name=nodename\033[0m";}
 M7(){ TPUT 12 3; $e "Имя субъекта. Всегда предполагается полное доменное имя                             \033[32m    subject-fqdn=nodename\033[0m";}
 M8(){ TPUT 13 3; $e "Только числовой вывод                                                               \033[32m -n                      \033[0m";}
 M9(){ TPUT 14 3; $e "Сообщить о невыполненном ответе ICMP ECHO                                           \033[32m -O                      \033[0m";}
M10(){ TPUT 15 3; $e "Вы можете указать до 16 «вспомогательных» байтов для заполнения отправляемого пакета\033[32m -p pattern              \033[0m";}
M11(){ TPUT 16 3; $e "Тихий выход                                                                         \033[32m -q                      \033[0m";}
M12(){ TPUT 17 3; $e "Установите биты, связанные с качеством обслуживания, в дейтаграммах ICMP            \033[32m -Q tos                  \033[0m";}
M13(){ TPUT 18 3; $e "Обойти обычные таблицы маршрутизации и отправить напрямую на хост через интерфейс   \033[32m -r                      \033[0m";}
M14(){ TPUT 19 3; $e "Tолько пинг и запись маршрута                                                       \033[32m -R                      \033[0m";}
M15(){ TPUT 20 3; $e "Задает количество отправляемых байтов данных                                        \033[32m -s packetsize           \033[0m";}
M16(){ TPUT 21 3; $e "Установить сокет sndbuf                                                             \033[32m -S sndbuf               \033[0m";}
M17(){ TPUT 22 3; $e "Tолько пинг. Установите IP Time to Live                                             \033[32m -t ttl                  \033[0m";}
M18(){ TPUT 23 3; $e "Установите специальные параметры временной метки IP                                 \033[32m -T timestamp option     \033[0m";}
M19(){ TPUT 24 3; $e "Распечатайте полную межпользовательскую задержку (старое поведение)                 \033[32m -U                      \033[0m";}
M20(){ TPUT 25 3; $e "Подробный вывод                                                                     \033[32m -v                      \033[0m";}
M21(){ TPUT 26 3; $e "Показать версию и выйти                                                             \033[32m -V                      \033[0m";}
M22(){ TPUT 27 3; $e "Укажите тайм-аут в секундах перед завершением проверки связи                        \033[32m -w deadline             \033[0m";}
M23(){ TPUT 28 3; $e "Время ожидания ответа в секундах                                                    \033[32m -W timeout              \033[0m";}
M24(){ TPUT 29 3; $e "При использовании команды ping для изоляции сбоев ее сначала следует запустить на локальном хосте...         ";}
M25(){ TPUT 30 3; $e "Протестируйте с помощью пинга:                                                                               ";}
#
M26(){ TPUT 32 3; $e "                                                                                    \033[34m Grannik Git             \033[0m";}
M27(){ TPUT 33 3; $e "Выход                                                                               \033[32m EXIT                    \033[0m";}
LM=27
   MENU(){ for each in $(seq 0 $LM);do M${each};done;}
    POS(){ if [[ $cur == up ]];then ((i--));fi
           if [[ $cur == dn ]];then ((i++));fi
           if [[ $i -lt 0   ]];then i=$LM;fi
           if [[ $i -gt $LM ]];then i=0;fi;}
REFRESH(){ after=$((i+1)); before=$((i-1))
           if [[ $before -lt 0  ]];then before=$LM;fi
           if [[ $after -gt $LM ]];then after=0;fi
           if [[ $j -lt $i      ]];then UNMARK;M$before;else UNMARK;M$after;fi
           if [[ $after -eq 0 ]] || [ $before -eq $LM ];then
           UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;}
   INIT(){ R;HEAD;FOOT;MENU;}
     SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;}
# Функция возвращения в меню
     ES(){ MARK;$e " ENTER = main menu ";$b;read;INIT;};INIT
  while [[ "$O" != " " ]]; do case $i in
 0) S=M0;SC;if [[ $cur == enter ]];then R;echo " Запросите локальные адреса IPv6.";ES;fi;;
 1) S=M1;SC;if [[ $cur == enter ]];then R;echo " Запросить адреса IPv6 на других интерфейсах.";ES;fi;;
 2) S=M2;SC;if [[ $cur == enter ]];then R;echo " Запросы адресов IPv4. Есть один специфический флаг IPv4.";ES;fi;;
 3) S=M3;SC;if [[ $cur == enter ]];then R;echo " Запросить адреса IPv4 на других интерфейсах.";ES;fi;;
 4) S=M4;SC;if [[ $cur == enter ]];then R;echo " Субъектный адрес IPv6.";ES;fi;;
 5) S=M5;SC;if [[ $cur == enter ]];then R;echo " Субъектный адрес IPv4.";ES;fi;;
 6) S=M6;SC;if [[ $cur == enter ]];then R;echo " Имя субъекта. Если он содержит более одной точки, предполагается полное доменное имя.";ES;fi;;
 7) S=M7;SC;if [[ $cur == enter ]];then R;echo " Имя субъекта. Всегда предполагается полное доменное имя.";ES;fi;;
 8) S=M8;SC;if [[ $cur == enter ]];then R;echo " Только числовой вывод. Попытки поиска символьных имен для адресов хостов предприниматься не будут.";ES;fi;;
 9) S=M9;SC;if [[ $cur == enter ]];then R;echo "  Сообщить о невыполненном ответе ICMP ECHO перед отправкой следующего пакета. Это полезно вместе с меткой времени -D для регистрации вывод в диагностический файл и
 поиск недостающих ответов.";ES;fi;;
10) S=M10;SC;if [[ $cur == enter ]];then R;echo "  Вы можете указать до 16 «вспомогательных» байтов для заполнения отправляемого пакета. Это полезно для диагностики зависимых от данных проблемы в сети.
 Например, -p ff заставит отправленный пакет заполниться всеми единицами.";ES;fi;;
11) S=M11;SC;if [[ $cur == enter ]];then R;echo " Тихий выход. Ничего не отображается, кроме итоговых строк во время запуска и после завершения.";ES;fi;;
12) S=M12;SC;if [[ $cur == enter ]];then R;echo "   Установите биты, связанные с качеством обслуживания, в дейтаграммах ICMP. tos может быть десятичным (только ping) или шестнадцатеричным числом. В RFC2474 эти поля
 интерпретируются как 8-битные дифференцированные услуги (DS), состоящие из: битов 0-1 (2 младших бита) отдельных данных и биты 2-7 (старшие 6 бит) кодовой точки
 дифференцированных услуг (DSCP). В RFC2481 и RFC3168, биты 0-1 используются для ECN. Исторически (RFC1349, устаревший RFC2474) они интерпретировались как: бит 0
 (младший бит) для зарезервированных (в настоящее время переопределяется как управление перегрузкой), 1–4 для типа службы и биты 5–7 (старшие биты) для приоритета.";ES;fi;;
13) S=M13;SC;if [[ $cur == enter ]];then R;echo "   Обойти обычные таблицы маршрутизации и отправить напрямую на хост через подключенный интерфейс. Если хост не на сеть с прямым подключением, возвращается ошибка.
 Эту опцию можно использовать для проверки связи с локальным хостом через интерфейс, который не имеет маршрута через него, если также используется опция -I.";ES;fi;;
14) S=M14;SC;if [[ $cur == enter ]];then R;echo "   Tолько пинг. Запись маршрута. Включает опцию RECORD_ROUTE в пакет ECHO_REQUEST и отображает буфер маршрута на вернул пакеты. Обратите внимание, что заголовок IP
 достаточно велик только для девяти таких маршрутов. Многие хосты игнорируют или игнорируют это вариант.";ES;fi;;
15) S=M15;SC;if [[ $cur == enter ]];then R;echo "  Задает количество отправляемых байтов данных. По умолчанию 56, что переводится в 64 байта данных ICMP, когда в сочетании с 8 байтами данных заголовка ICMP.";ES;fi;;
16) S=M16;SC;if [[ $cur == enter ]];then R;echo " Установить сокет sndbuf. Если не указано, выбирается для буферизации не более одного пакета.";ES;fi;;
17) S=M17;SC;if [[ $cur == enter ]];then R;echo " Tолько пинг. Установите IP Time to Live.";ES;fi;;
18) S=M18;SC;if [[ $cur == enter ]];then R;echo "  Установите специальные параметры временной метки IP. опция timestamp может быть tsonly (только отметки времени), tsandaddr (отметки времени и адресов) или
 tsprespec host1 [host2 [host3 [host4]]] (заранее заданные переходы с меткой времени).";ES;fi;;
19) S=M19;SC;if [[ $cur == enter ]];then R;echo "  Распечатайте полную межпользовательскую задержку (старое поведение). Обычно ping печатает время прохождения сети туда и обратно, которое может быть разные,
 например. из-за сбоев DNS.";ES;fi;;
20) S=M20;SC;if [[ $cur == enter ]];then R;echo " Подробный вывод. Не подавляйте ответы DUP при проверке адреса многоадресной рассылки.";ES;fi;;
21) S=M21;SC;if [[ $cur == enter ]];then R;echo " Показать версию и выйти.";ES;fi;;
22) S=M22;SC;if [[ $cur == enter ]];then R;echo "  Укажите тайм-аут в секундах перед завершением проверки связи независимо от того, сколько пакетов было отправлено или получено. В этом случае, если пинг не
 останавливается после отправки пакета счетчика, он ожидает либо истечения крайнего срока, либо до тех пор, пока счетчики не будут ответил или на какое-то уведомление
 об ошибке из сети.";ES;fi;;
23) S=M23;SC;if [[ $cur == enter ]];then R;echo " Время ожидания ответа в секундах. Опция влияет только на тайм-аут при отсутствии ответов, в противном случае пинг ждет двух RTT.";ES;fi;;
24) S=M24;SC;if [[ $cur == enter ]];then R;echo "    При использовании команды ping для изоляции сбоев ее сначала следует запустить на локальном хосте, чтобы убедиться, что локальная сеть интерфейс запущен и
 работает. Затем хосты и шлюзы все дальше и дальше должны быть «пингованы». Время туда и обратно и вычисляется статистика потери пакетов. Если получены повторяющиеся
 пакеты, они не включаются в потерю пакетов вычисление, хотя время приема-передачи этих пакетов используется при вычислении минимального/среднего/максимального/mdev
 числа туда и обратно.
   Стандартное отклонение совокупности (mdev), по сути, среднее значение того, насколько далеко RTT каждого эхо-запроса отличается от среднего RTT. Выше mdev, тем
 более изменчивым будет RTT (с течением времени). Из-за высокой вариабельности RTT у вас будут проблемы со скоростью при большом количестве переводы (они займут
 больше времени, чем это, строго говоря, необходимо, поскольку изменчивость в конечном итоге приведет к отправитель, чтобы дождаться ACK), и вы получите качество VoIP
 от среднего до низкого.
   Когда указанное количество пакетов было отправлено (и получено) или если программа завершена с помощью SIGINT, отображается краткая сводка. Более короткую текущую
 статистику можно получить без остановки процесса сигналом SIGQUIT.
   Если ping вообще не получает ответных пакетов, он выйдет с кодом 1. Если количество пакетов и крайний срок равны указано, и меньше чем количество пакетов получено
 к моменту наступления крайнего срока, он также будет завершен с кодом 1. При другой ошибке он выходит с кодом 2. В противном случае он выходит с кодом 0. Это
 позволяет использовать код выхода для посмотреть, жив ли хост или нет.
   Эта программа предназначена для использования при тестировании, измерении и управлении сетью. Из-за нагрузки он может путь (в сети или в хостах).
   Допускается вещественное число с точкой в ​​качестве десятичного разделителя (независимо от настройки локали) .RE";ES;fi;;
25) S=M25;SC;if [[ $cur == enter ]];then R;echo " ping google.com
#
 ping archlinux.org";ES;fi;;
#
26) S=M26;SC;if [[ $cur == enter ]];then R;echo "
 Программа туториал (пошаговое объяснение, инструкция по выполнению), для утилиты ping - отправить ICMP ECHO_REQUEST на сетевые узлы.
 https://github.com/GrannikOleg/mPing
 https://gitlab.com/GrannikOleg/mping
 https://sourceforge.net/p/mping
 https://notabug.org/Grannikoleg/mPing
 https://bitbucket.org/grannikoleg/workspace/projects/MPIN
 Grannik | 2021.11.25
";ES;fi;;
27) S=M27;SC;if [[ $cur == enter ]];then R;clear;exit 0;fi;;
 esac;POS;done
